const { loadEnv } = require('vite');
const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');

// 获取当前环境模式
const mode = process.env.NODE_ENV || 'development';

// 是否将pagesMain文件夹单独打包小程序
const env = loadEnv(mode, process.cwd());
const { VITE_OPEN_SUB_MINI } = env;

/**
 * 重命名目录
 * @param srcDir - 原目录
 * @param targetDir - 目标目录
 */
function renameDirectory(srcDir, targetDir) {
  try {
    const stats = fs.statSync(srcDir);
    if (stats.isDirectory()) {
      fs.renameSync(srcDir, targetDir);
      console.log(`Directory renamed from "${srcDir}" to "${targetDir}" successfully!`);
    } else {
      console.log(`The directory "${srcDir}" does not exist.`);
    }
  } catch (err) {
    console.error('Error:', err);
  }
}

/**
 * 将src目录下的pages 文件夹名修改为 pages-Deprecated
 * @param isRollback - 是否反转
 */
function changePagesToPageDeprecated(isRollback) {
  const pagesDir = path.join(__dirname, '..', 'src', 'pages');
  const pagesTargetDir = path.join(__dirname, '..', 'src', 'pages-Deprecated');

  if (isRollback) {
    if (fs.existsSync(pagesDir)) return;
    renameDirectory(pagesTargetDir, pagesDir);
  } else {
    if (fs.existsSync(pagesTargetDir)) return;
    renameDirectory(pagesDir, pagesTargetDir);
  }
}

/**
 * 将分包转换为pages主包
 * @param subPackageData - 分包json
 * @param isRollback - 是否反转
 */
async function changeSubPackagesToPage(subPackageData, isRollback) {
  const { subPackages, pagePath } = subPackageData;
  const subPackagesDir = path.join(__dirname, '..', subPackageData.pagePath);
  const pagesDir = path.join(__dirname, '..', 'src', 'pages');

  if (!isRollback) {
    if (subPackages.includes(pagePath)) {
      subPackages.splice(subPackages.indexOf(pagePath), 1);
    }
    if (!fs.existsSync(subPackagesDir)) return;

    renameDirectory(subPackagesDir, pagesDir);

    fs.writeFileSync(path.join(__dirname, '..', 'subpackage.json'), JSON.stringify(subPackageData, null, 2));
  } else {
    if (fs.existsSync(subPackagesDir)) return;

    if (!subPackages.includes(pagePath)) {
      //询问用户是否需要将 pagePath 放在 subPackages 中
      const { isSubPackages } = await inquirer.prompt({
        type: 'confirm',
        name: 'isSubPackages',
        message: `是否需要将 ${pagePath} 作为分包加载`
      });

      if (isSubPackages) {
        subPackages.push(pagePath);
      }
      fs.writeFileSync(path.join(__dirname, '..', 'subpackage.json'), JSON.stringify(subPackageData, null, 2));
    }

    renameDirectory(pagesDir, subPackagesDir);
  }
}

//是否需要将分包单独打包小程序

//是否需要将分包单独打包小程序
const isOpenSubMini = VITE_OPEN_SUB_MINI == 'true';
async function build() {
  // 读取 subPackages.json 文件
  const data = fs.readFileSync(path.join(__dirname, '..', 'subpackage.json'), 'utf8');
  // 解析 JSON 内容
  const subPackageData = JSON.parse(data);
  if (isOpenSubMini) {
    if (!subPackageData.pagePath) {
      throw new Error('请在subPackages.json文件中配置pagePath  --- 需要单独打包小程序的分包路径');
    }
    // 将src目录下的pages 文件夹名修改为 pages-Deprecated
    changePagesToPageDeprecated();
    // 将分包转换为pages主包
    await changeSubPackagesToPage(subPackageData);
  } else {
    //将pages 转换为分包
    await changeSubPackagesToPage(subPackageData, true);
    // 将src目录下的pages-Deprecated  文件夹名修改为  pages
    changePagesToPageDeprecated(true);
  }
}

build();
